package com.itbupt.eat.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.itbupt.eat.common.BaseContext;
import com.itbupt.eat.entity.AddressBook;
import com.itbupt.eat.mapper.AddressBookMapper;
import com.itbupt.eat.service.IAddressBookService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;

import java.util.List;

/**
 * @Author BUPT-Dingchang
 * @Create 2024/5/1 17:00
 * ClassName: AddressBookServiceImpl
 * Description:
 */

@Slf4j
@Service
public class AddressBookServiceImpl extends ServiceImpl<AddressBookMapper, AddressBook> implements IAddressBookService {

    /**
     * 新增地址
     * @param addressBook   地址信息
     * @return  地址信息
     */
    @Override
    public AddressBook saveAdd(AddressBook addressBook) {
        // 获取当前登录用户id，设置为当前地址的userid
        addressBook.setUserId(BaseContext.getCurrentUserId());

        // 保存地址信息
        this.save(addressBook);

        return addressBook;
    }

    /**
     * 地址展示
     * @return  地址列表
     */
    @Override
    public List<AddressBook> getList() {
        // 获取当前登录用户id
        Long userId = BaseContext.getCurrentUserId();

        // 查询当前用户的地址列表
        LambdaQueryWrapper<AddressBook> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.eq(userId != null, AddressBook::getUserId, userId);
        queryWrapper.orderByDesc(AddressBook::getUpdateTime);
        return this.list(queryWrapper);
    }


    /**
     * 设置默认地址
     * @param addressBook   地址信息
     * @return  地址信息
     */
    @Override
    public AddressBook setDefault(AddressBook addressBook) {
        // 1.先把当前用户的所有地址的is_default字段设为0

        // 1.1 创建更新条件封装器
        LambdaUpdateWrapper<AddressBook> luw = new LambdaUpdateWrapper<>();
        // 1.2 添加更新条件：指定当前登录用户ID
        luw.eq(AddressBook::getUserId, BaseContext.getCurrentUserId());
        // 1.3 添加更新添加：把所有记录的is_default字段设为0
        luw.set(AddressBook::getIsDefault, 0);
        // 1.4 调用数据层更新方法，入参是更新条件封装器luw
        this.update(luw);

        // 2.再把当前传入的地址设为默认地址
        // 2.1 把传入的地址对象的isDefault属性设为1
        addressBook.setIsDefault(1);
        // 2.2 调用数据层的更新方法，注意null不会参与更新，只会更新不为null的字段
        // UPDATE address_book SET is_default=?, update_time=?, update_user=? WHERE id=?
        this.updateById(addressBook);

        return addressBook;

    }


    /**
     * 获取当前用户的默认地址
     * @return  地址信息
     */
    @Override
    public AddressBook getDefault() {
        Long userId = BaseContext.getCurrentUserId();

        LambdaQueryWrapper<AddressBook> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.eq(userId != null, AddressBook::getUserId, userId);
        queryWrapper.eq(AddressBook::getIsDefault, 1);

        return this.getOne(queryWrapper);
    }
}
